#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time： 2023-05-31
@Auth： 系统维护
@File： clean_logs.py
@Description：清理日志文件夹，删除多余的日志文件
"""

import os
import re
import time
import shutil
from pathlib import Path
from datetime import datetime

# 获取项目根目录
project_root = Path(__file__).resolve().parent.parent
# 日志目录
LOG_DIR = project_root / "logs"

def clean_process_based_logs():
    """
    清理基于进程ID的日志文件
    这些文件格式为: core_app_12345_1234567890.log
    """
    count = 0
    failed_count = 0
    # 检查日志目录是否存在
    if not LOG_DIR.exists():
        print(f"日志目录不存在: {LOG_DIR}")
        return count
        
    # 查找所有进程ID格式的日志文件
    pattern = re.compile(r'(core|utils)_(app|error|access)_\d+_\d+\.log')
    for file in LOG_DIR.glob('*'):
        if pattern.match(file.name):
            try:
                os.remove(file)
                count += 1
            except PermissionError:
                print(f"文件 {file.name} 正在被使用，无法删除")
                failed_count += 1
            except Exception as e:
                print(f"删除文件 {file.name} 时出错: {str(e)}")
                failed_count += 1
    
    if failed_count > 0:
        print(f"有 {failed_count} 个文件无法删除，可能正在被使用")
    
    return count

def convert_to_date_based_logs():
    """
    将日志配置更改为基于日期的日志文件
    """
    success = True
    # 修改core/log/setting.py文件
    setting_file = project_root / "core" / "log" / "setting.py"
    
    if not setting_file.exists():
        print(f"日志设置文件不存在: {setting_file}")
        return False
        
    try:
        # 读取文件内容
        with open(setting_file, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # 替换PROCESS_ID为日期格式
        content = content.replace(
            "PROCESS_ID = f\"{os.getpid()}_{int(time.time())}\"", 
            "# 使用日期作为日志文件标识\nPROCESS_ID = \"{time:YYYY-MM-DD}\""
        )
        
        # 替换日志文件路径
        content = content.replace(
            "f'core_app_{PROCESS_ID}.log'", 
            "'core_app_{time:YYYY-MM-DD}.log'"
        )
        content = content.replace(
            "f'core_error_{PROCESS_ID}.log'", 
            "'core_error_{time:YYYY-MM-DD}.log'"
        )
        content = content.replace(
            "f'core_access_{PROCESS_ID}.log'", 
            "'core_access_{time:YYYY-MM-DD}.log'"
        )
        
        # 写入修改后的内容
        with open(setting_file, 'w', encoding='utf-8') as f:
            f.write(content)
        
        print(f"已更新日志配置文件: {setting_file}")
    except Exception as e:
        print(f"更新 {setting_file} 时出错: {str(e)}")
        success = False
    
    # 修改utils/logger.py文件
    logger_file = project_root / "utils" / "logger.py"
    
    if not logger_file.exists():
        print(f"日志工具文件不存在: {logger_file}")
        return False
        
    try:
        # 读取文件内容
        with open(logger_file, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # 替换PROCESS_ID为日期格式
        content = content.replace(
            "PROCESS_ID = f\"{os.getpid()}_{int(time.time())}\"", 
            "# 使用日期作为日志文件标识\nPROCESS_ID = \"{time:YYYY-MM-DD}\""
        )
        
        # 使用固定写法替换，不使用变量
        if "f\"utils_logger_{PROCESS_ID}" in content:
            content = content.replace(
                "f\"utils_logger_{PROCESS_ID}_{time:YYYY-MM-DD}.log\"", 
                "\"utils_logger_{time:YYYY-MM-DD}.log\""
            )
        
        if "f\"utils_error_{PROCESS_ID}" in content:
            content = content.replace(
                "f\"utils_error_{PROCESS_ID}_{time:YYYY-MM-DD}.log\"", 
                "\"utils_error_{time:YYYY-MM-DD}.log\""
            )
        
        # 写入修改后的内容
        with open(logger_file, 'w', encoding='utf-8') as f:
            f.write(content)
        
        print(f"已更新日志工具文件: {logger_file}")
    except Exception as e:
        print(f"更新 {logger_file} 时出错: {str(e)}")
        success = False
    
    return success

def clean_old_logs(days=7):
    """
    清理指定天数之前的日志文件
    
    Args:
        days: 保留的天数
    """
    count = 0
    failed_count = 0
    current_time = time.time()
    # 计算保留期限的时间戳
    cutoff_time = current_time - (days * 24 * 60 * 60)
    
    # 检查日志目录是否存在
    if not LOG_DIR.exists():
        print(f"日志目录不存在: {LOG_DIR}")
        return count
    
    # 遍历所有日志文件，删除过期的
    for file in LOG_DIR.glob('*'):
        if file.is_file():
            try:
                # 获取文件的修改时间
                file_time = file.stat().st_mtime
                if file_time < cutoff_time:
                    os.remove(file)
                    count += 1
            except PermissionError:
                print(f"文件 {file.name} 正在被使用，无法删除")
                failed_count += 1
            except Exception as e:
                print(f"处理文件 {file.name} 时出错: {str(e)}")
                failed_count += 1
    
    if failed_count > 0:
        print(f"有 {failed_count} 个过期文件无法删除，可能正在被使用")
    
    return count

def create_empty_log_files():
    """
    创建按日期命名的空日志文件，用于替代进程ID命名的日志
    """
    today = datetime.now().strftime("%Y-%m-%d")
    log_files = [
        f"core_app_{today}.log",
        f"core_error_{today}.log",
        f"core_access_{today}.log",
        f"utils_logger_{today}.log",
        f"utils_error_{today}.log"
    ]
    
    # 确保日志目录存在
    os.makedirs(LOG_DIR, exist_ok=True)
    
    # 创建空文件
    for file_name in log_files:
        file_path = os.path.join(LOG_DIR, file_name)
        if not os.path.exists(file_path):
            try:
                with open(file_path, 'w', encoding='utf-8') as f:
                    f.write(f"日志文件创建于 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                print(f"创建日志文件: {file_name}")
            except Exception as e:
                print(f"创建文件 {file_name} 时出错: {str(e)}")

def main():
    """主函数"""
    print(f"开始清理日志文件夹: {LOG_DIR}")
    
    # 删除基于进程ID的日志文件
    count = clean_process_based_logs()
    print(f"已删除 {count} 个基于进程ID的日志文件")
    
    # 转换到基于日期的日志配置
    if convert_to_date_based_logs():
        print("成功更新日志配置为按日期区分")
    else:
        print("更新日志配置失败")
    
    # 创建新的日期命名日志文件
    create_empty_log_files()
    
    # 清理7天以前的日志文件
    count = clean_old_logs(7)
    print(f"已删除 {count} 个过期的日志文件")
    
    print("日志清理完成")

if __name__ == "__main__":
    main() 